S-dbeaver 업데이트 후 한글 깨짐
개요
7. SQL 최적화 기본 원리을 공부하다가 맞닥뜨린 이슈.
문제 파악
그제까지 잘 되던 인코딩에.. 문제가 생겼다.
이상한 것이, sql 파일까지 깨졌다는 것이다.
나는 이게 처음에는 dbeaver 세팅 문제일 것이라 생각했다.
그러나 나는 인코딩 관련해서는 건드린 게 없기에, 영문을 잘 모르겠다.
그런데 진짜 문제는 이것이었다.
내 터미널은 utf8을 읽도록 돼있는데 여기에서도 깨진다는 것은, 말그대로 파일 인코딩이 다르게 됐다는 것.
어째서?
찾아보니 sql 모든 스크립트의 인코딩 방식에 변화가 생긴 듯했다.
열어보지 않은지 오래 된 파일들 조차도 이렇게 바뀌었다는 것은, 역시 dbeaver가 자신이 관리하는 스크립트들을 망친 것이라는 생각이다.
무슨 짓을 했길래...?
utf8이 아닌 게 보인다.
더더욱 큰 문제는, 인코딩을 바꿔도 결과가.. 그대로라는 것이다.
완전 그대로는 아니지.
물음표들이 이상한 문자로 바뀌었으니까.
dbeaver 이놈 자체는 또 사실 utf8이 잘 걸려있단 말이다..
디비에서의 문제는 없는 것으로 보인다.
해결
그럼 해결은 어떻게 하는가?
일단 인코딩 방식을 돌려놔야 한다.
방법을 찾았다.
역시, 단순히 iso로 풀 수 있을 것 같지 않았다.
국가마다 이것을 독자적으로 방식을 세팅했기에 혹시나 했는데.
근데 이 이슈를 겪으면서 알게 된 것도 있다.
지금까지 내가 일일히 수작업으로 풀어헤쳐진 예제 스크립트의 괴이문자들을, 이제 쉽게 바꿀 수 있게 됐다는 것.
다 뒤져따..
일단 iconv 명령어는 출력을 기존 파일로 넣는 작업을 하면 데이터가 날아간다.
다른 파일에 넣을 때는 잘 들어가는 것이 확인됐으므로, iconv의 동작 원리와 맞닿아 있는 영역인 듯하다.
어쩌면 파이프의 작업 순서가 보장되지 않아 발생하는 문제일 수도 있다.
from os import listdir
import subprocess
def main():
scriptPath = "./Scripts"
lst = listdir(scriptPath)
sqlLst = []
for i in lst:
if not i.endswith(".sql"):
dir = scriptPath + "/" + i
sqlLst.extend(map(lambda x: i + "/" + x, listdir(dir)))
else:
sqlLst.append(i)
errLst = []
for i in map(lambda x: scriptPath + "/" + x, sqlLst):
script = "iconv -f euc-kr -t utf-8 -o " + i + " " + i
t = subprocess.run(script.split(), capture_output=True, encoding="utf-8")
if t.returncode:
errLst.append(i)
if errLst:
print("This files has some err while applying utf-8.")
print("If this is unexpected, check the details.")
print(errLst)
else:
print("job finished")
if __name__ == "__main__":
main()
시간 없어서 대충 후루룩 짭짭 스크립트를 만들었다.
대충 만들었지만, 동작은 잘 되는 게 확인됐다.
오예에스
정리
파일들이 알 수 없는 방식으로 인코딩됐다.
iso-8859-1, 즉 확장형 아스키 방식인 것으로 보이나, utf8로 바꿔도 깨진다는 것은 무언가 이상해서 여기에서 판단이 막힌다.
원인은 결국 dbeaver가 무언갈 한 것은 확실하다는 것이 내 생각이다.
dbeaver에서 추적되는 스크립트 파일만 이 난리가 났으니.
짐작가는 원인 중 하나는, 내가 최근에 dbeaver를 업데이트한 것.
새 버전이 나왔다고 계속 찡얼대기에 냅다 업데이트했는데, 그때 무슨 일이 발생한 것 같다.
이제보니 vim 플러그인도 날아갔다.
하하..
업데이트는 항상 신중하게 해야 한다!
자신이 추적하는 파일의 인코딩을 바꿔버리는 이슈라.. 정말 생각지도 못한 이슈.
달리 생각되는 원인이 없다.